package dao;

import java.util.List;
import modelo.Usuario;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import util.HibernateUtil;

public class UsuarioDAOHibernate implements UsuarioDAO {

    @Override
    public boolean criar(Usuario usuario) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            sessao.save(usuario);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public Usuario buscarPorNomeUsuario(Usuario usuario) {
        Usuario modelo = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        String sql = "from Usuario where nome_usuario = '" + usuario.getNomeUsuario() + "'";
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            modelo = (Usuario) sessao.createQuery(sql).uniqueResult();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return modelo;
    }

    @Override
    public List<Usuario> listar() {
        List<Usuario> lista = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        String sql = "from Usuario u left join fetch u.funcao";
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            lista = sessao.createQuery(sql).list();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return lista;
    }

    @Override
    public boolean alterar(Usuario usuario) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Usuario usuarioDB = (Usuario) sessao.load(Usuario.class, usuario.getNomeUsuario());
            usuarioDB.setFuncao(usuario.getFuncao());
            usuarioDB.setSenha(usuario.getSenha());
            usuarioDB.setEstado(usuario.getEstado());
            usuarioDB.setDataCriacao(usuario.getDataCriacao());
            usuarioDB.setNome(usuario.getNome());
            usuarioDB.setCpf(usuario.getCpf());
            usuarioDB.setEmail(usuario.getEmail());
            usuarioDB.setEndereco(usuario.getEndereco());
            usuarioDB.setTelefone(usuario.getTelefone());
            sessao.update(usuarioDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public boolean excluir(Usuario usuario) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Usuario usuarioDB = (Usuario) sessao.load(Usuario.class, usuario.getNomeUsuario());
            sessao.delete(usuarioDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public Usuario login(Usuario usuario) {
        Usuario modelo = this.buscarPorNomeUsuario(usuario);
        if (modelo != null) {
            if (!usuario.getSenha().equals(modelo.getSenha())) {
                modelo = null;
            }
        }
        return modelo;
    }

}
